package cn.bugstack.controller;

import cn.bugstack.common.constants.Constants;
import cn.bugstack.common.response.Response;
import cn.bugstack.service.ILoginService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * @author Fuzhengwei bugstack.cn @小傅哥
 * @description 登录服务
 * @create 2024-09-28 13:58
 */
@Slf4j
@RestController()
@CrossOrigin("*") // 允许所有跨域请求
@RequestMapping("/api/v1/login/")  // 基础路径
public class LoginController {

    @Resource
    private ILoginService loginService;  // 登录服务接口

    /**
     * 生成微信二维码凭证
     * http://xfg-studio.natapp1.cc/api/v1/login/weixin_qrcode_ticket
     * 请求示例：GET http://localhost:8080/api/v1/login/weixin_qrcode_ticket
     * @return
     *
     * 实现流程：
     * （1）前段调用此接口请求二维码
     * （2）服务端通过loginService调用微信API生成带参数的二维码凭证（ticket）
     * （3）返回给前段类似TICKET_123456的凭证字符串
     *
     * 响应结构：
     * {
     *   "code": 200,
     *   "info": "成功",
     *   "data": "TICKET_abcdef123456"
     * }
     */
    @RequestMapping(value = "weixin_qrcode_ticket", method = RequestMethod.GET)
    public Response<String> weixinQrCodeTicket() {
        try {
            String qrCodeTicket = loginService.createQrCodeTicket();
            log.info("生成微信扫码登录 ticket:{}", qrCodeTicket);
            return Response.<String>builder()
                    .code(Constants.ResponseCode.SUCCESS.getCode())
                    .info(Constants.ResponseCode.SUCCESS.getInfo())
                    .data(qrCodeTicket)
                    .build();
        } catch (Exception e) {
            log.error("生成微信扫码登录 ticket 失败", e);
            return Response.<String>builder()
                    .code(Constants.ResponseCode.UN_ERROR.getCode())
                    .info(Constants.ResponseCode.UN_ERROR.getInfo())
                    .build();
        }
    }

    /**
     * 检测登录状态
     *
     * http://xfg-studio.natapp1.cc/api/v1/login/check_login
     *
     * 请求示例：GET http://localhost:8080/api/v1/login/check_login?ticket=TICKET_abcdef123456
     * 实现流程：
     *（1）前端轮询此接口（建议每2秒一次）
     *（2）服务端根据ticket检查：
     *         用户是否已扫码
     *         是否确认登录
     *（3）返回结果：
     *         已登录：携带用户凭证（如JWT token）
     *         未登录：返回未登录状态码
     *         异常：返回系统错误
     */
    @RequestMapping(value = "check_login", method = RequestMethod.GET)
    public Response<String> checkLogin(@RequestParam String ticket) {
        try {
            String openidToken = loginService.checkLogin(ticket);
            log.info("扫码检测登录结果 ticket:{} openidToken:{}", ticket, openidToken);
            if (StringUtils.isNotBlank(openidToken)) {
                return Response.<String>builder()
                        .code(Constants.ResponseCode.SUCCESS.getCode())
                        .info(Constants.ResponseCode.SUCCESS.getInfo())
                        .data(openidToken)
                        .build();
            } else {
                return Response.<String>builder()
                        .code(Constants.ResponseCode.NO_LOGIN.getCode())
                        .info(Constants.ResponseCode.NO_LOGIN.getInfo())
                        .build();
            }
        } catch (Exception e) {
            log.error("扫码检测登录结果失败 ticket:{}", ticket, e);
            return Response.<String>builder()
                    .code(Constants.ResponseCode.UN_ERROR.getCode())
                    .info(Constants.ResponseCode.UN_ERROR.getInfo())
                    .build();
        }
    }

}
